package com.xymtop.sqlcater.core.sql.sqlparser.tosql.tree;


import com.xymtop.sqlcater.core.sql.sqlparser.tosql.entity.sql.AppContent;
import com.xymtop.sqlcater.core.sql.sqlparser.tosql.entity.sql.Element;
import com.xymtop.sqlcater.core.sql.sqlparser.tosql.entity.sql.SqlNode;
import com.xymtop.sqlcater.core.sql.sqlparser.tosql.entity.sql.SqlNodeType;
import com.xymtop.sqlcater.core.sql.sqlparser.tosql.entity.tree.TreeNode;
import lombok.Data;

//解析调用树
@Data
public class ParseTree {
    //使用AppContent生成调用树
    private AppContent appContent;

    //调用树主节点
    private TreeNode mainNode;


    public static ParseTree add(AppContent appContent){
        ParseTree parseTree = new ParseTree();
        parseTree.appContent = appContent;
        return parseTree;
    }


    //开始构建调用树
    public ParseTree build(){
        if(appContent!=null&&appContent.getResElements()!=null){

            //如果map不存在就构建map
            if(appContent.getElementMap().isEmpty()){
                for(Element element : appContent.getResElements()){
                    appContent.getElementMap().put(element.getName(),element);
                }
            }

            if(!appContent.getResElements().isEmpty()){
                for(Element element:appContent.getResElements()){
                    //开始解析节点
                    if(mainNode==null){

                        //获取主节点
                        Element mainElement = appContent.getElementMap().get("run");

                        //解析主节点
                        if(mainElement!=null){

                            //构造主节点
                            mainNode = ParseElement(mainElement);

                        }

                    }
                }
            }
        }
        return this;
    }


    //解析节点到调用树节点
    public TreeNode ParseElement(Element element){

        //构建新节点
        TreeNode treeNode = new TreeNode();

        //设置基本信息
        treeNode.setName(element.getName());
        treeNode.setElement(element);


        //构造该节点的调用树
        for(SqlNode sqlNode : element.getSqlNodes()){

            //确保已经解析过
            if(sqlNode!=null&&sqlNode.getIsParse()){

                //对名称进行处理
                if(sqlNode.getType()== SqlNodeType.VALUE||sqlNode.getType()==SqlNodeType.COLLECTION){
                    sqlNode.setName(sqlNode.getName().substring(1,sqlNode.getName().length()));
                }

                //获取到节点
                Element nodeElement = appContent.getElementMap().get(sqlNode.getName());

                if(nodeElement!=null) {
                    //调用树临时节点
                    TreeNode node = new TreeNode();

                    //设置树节点基本信息
                    node.setName(nodeElement.getName());
                    node.setElement(nodeElement);

                    //循环调用
                    node = ParseElement(nodeElement);

                    //获取到节点，加入调用树
                    treeNode.getTreeNodes().add(node);
                }

            }
        }
        return treeNode;
    }

}
